﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

//柔性数组：本质是结构体中的一个成员变量
//柔性数组成员:C99中,结构体中的最后⼀个元素允许是未知⼤⼩的数组
//结构体最后一个成员的大小是未知的则为柔性数组成员
//struct st_type
//{
//	int i;
//	int a[0];//柔性数组成员 
//	//某些编译器无法编译可写成
//	//int a[];
//};

//特点
//结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
//sizeof返回的这种结构⼤⼩不包括柔性数组的内存 大小。
//包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配
//并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩
//struct S {
//	int n;
//	int arr[];
//};
//int main(){
//	struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);
//	if (ps == NULL)
//	{
//		//…
//		return 1;
//	}
//	ps->n = 100;
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		ps->arr[i] = i;
//	}
//	for (i = 0; i < 10; i++ ){
//		printf("%d ",ps->arr[i]);
//	}
//	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
//	if (ptr != NULL)
//	{
//		ps = ptr;
//		ptr = NULL;
//	}
//	//释放
//	free(ps);
//	//ps和ptr指向同一空间，不能释放ptr，否则ps将变为野指针
//	ps = NULL;
//	return 0;
//	}

struct SS {
	int m;
	int* arr;
};
int main(){
	struct SS* ps = (struct SS*)malloc(sizeof(struct SS));
	if (ps == NULL)
	{
		//…
		return 1;
	}
	ps->m = 100;
	ps->arr = (int*)malloc(40);
	if (ps->arr == NULL) {
		//...
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++ ){
		printf("%d ",ps->arr[i]);
	}
	//扩容
	int* ptr = (int*)realloc(ps->arr, 80);
	if (ptr == NULL)
	{
		return 1;
	}
	//使用...
	//释放
	free(ps->arr);
	free(ps);
	ps = NULL;
	return 0;
	}
